home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / let / let.y < prev   
Text File  |  1991-10-18  |  5KB  |  201 lines

  1. %{
  2. /*
  3.     電卓プログラム(環境変数対応)  by Y.Kurihara (Nifty PDC01620)
  4.  
  5.     Ver 0.01  1991.06.23
  6.     Ver 0.02  1991.07.28
  7.  
  8.     使用できる演算子('<','>'の変わりに'{','}'を使用する)
  9.     +   -   *   /   ()  ,   =   +=  -=  *=  /=  ++  -- 
  10.     ==  !=  {   }   {=  ={  }=  =}  &   |   &&  ||  ~   !
  11.  
  12.     使用したプログラム
  13.     LSI C-86 Ver 3.20 試食版 (C-MAGAZINE 付録)
  14.     KM-yacc ver 2.0 (C-MAGAZINE 付録)
  15. */
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <ctype.h>
  20. #include <dos.h>
  21. #include <environ.h>
  22. #define  YYSTYPE  long
  23. long     ret;
  24. int      cenv,renv;
  25. char    *cmd;
  26. long putval( long ptr,long val );
  27. long getval( long ptr );
  28. %}
  29.  
  30. %token  NUM,VAR
  31. %token  '(',')',',','\0','\n'
  32. %left   ','
  33. %right  '=',PLE,MIE,MUE,DIE
  34. %left   AND,OR
  35. %left   '{','}',LE,GE,EQ,NE
  36. %left   '+','-'
  37. %left   '*','/'
  38. %left   '&','|'
  39. %right  MINUS,'!','~'
  40. %nonassoc  PP,MM
  41.  
  42. %%
  43. line    :
  44.     | line expr '\n'    { ret = $2; }
  45.     | line error '\n'    { yyerrok; }
  46.     ;
  47.  
  48. expr    : VAR  '=' expr        { $$ = putval( $1,$3 ); }
  49.     | VAR  PP        { $$ = putval( $1,getval( $1 )+ 1 )- 1; }
  50.     | VAR  MM        { $$ = putval( $1,getval( $1 )- 1 )+ 1; }
  51.     | PP   VAR        { $$ = putval( $2,getval( $2 )+ 1 ); }
  52.     | MM   VAR        { $$ = putval( $2,getval( $2 )- 1 ); }
  53.     | VAR  PLE expr        { $$ = putval( $1,getval( $1 )+ $3 ); }
  54.     | VAR  MIE expr        { $$ = putval( $1,getval( $1 )- $3 ); }
  55.     | VAR  MUE expr        { $$ = putval( $1,getval( $1 )* $3 ); }
  56.     | VAR  DIE expr        { if( $3 == 0 )  $3 = 1;
  57.                   $$ = putval( $1,getval( $1 )/ $3 ); }
  58.     | expr ',' expr        { $$ = $3; }
  59.     | expr AND expr        { $$ = $1 && $3; }
  60.     | expr OR  expr        { $$ = $1 || $3; }
  61.     | expr EQ  expr        { $$ = $1 == $3; }
  62.     | expr NE  expr        { $$ = $1 != $3; }
  63.     | expr '}' expr        { $$ = $1 >  $3; }
  64.     | expr '{' expr        { $$ = $1 <  $3; }
  65.     | expr GE  expr        { $$ = $1 >= $3; }
  66.     | expr LE  expr        { $$ = $1 <= $3; }
  67.     | expr '+' expr        { $$ = $1 + $3; }
  68.     | expr '-' expr        { $$ = $1 - $3; }
  69.     | expr '*' expr        { $$ = $1 * $3; }
  70.     | expr '/' expr        { if( $3 == 0 )  $3 = 1;
  71.                   $$ = $1 / $3; }
  72.     | expr '&' expr        { $$ = $1 & $3; }
  73.     | expr '|' expr        { $$ = $1 | $3; }
  74.     | '(' expr ')'        { $$ = $2; }
  75.     | NUM            { $$ = $1; }
  76.     | VAR            { $$ = getval( $1 ); }
  77.     | '-' expr %prec MINUS    { $$ = - $2; }
  78.     | '!' expr        { $$ = ! $2; }
  79.     | '~' expr        { $$ = ~ $2; }
  80.     ;
  81.  
  82. %%
  83.  
  84. int yylex()
  85. {
  86.     int c;
  87.     char buff[128];
  88.  
  89.     while( ( c = *cmd++ )== ' ' || c == '\t' );
  90.     if( isdigit( c ) ) {
  91.         int n = 0;
  92.         do {
  93.             n = n * 10 + c - '0';
  94.             c = *cmd++;
  95.         } while( isdigit( c ) );
  96.         cmd--;
  97.         yylval = n;
  98.         return( NUM );
  99.     }
  100.     if( isalpha( c ) ) {
  101.         char *p = buff;
  102.         do {
  103.             *p++ = c;
  104.             c = *cmd++;
  105.         } while( isalnum( c ) );
  106.         cmd--;
  107.         *p = 0;
  108.         yylval = (long)strdup( buff );
  109.         return( VAR );
  110.     }
  111.     if( c > ' ' ) {
  112.         int c2 = *cmd++;
  113.         if( c == '&' && c2 == '&' )  return( AND );
  114.         if( c == '|' && c2 == '|' )  return( OR );
  115.         if( c == '=' && c2 == '=' )  return( EQ );
  116.         if( c == '!' && c2 == '=' )  return( NE );
  117.         if( c == '}' && c2 == '=' )  return( GE );
  118.         if( c == '=' && c2 == '}' )  return( GE );
  119.         if( c == '{' && c2 == '=' )  return( LE );
  120.         if( c == '=' && c2 == '{' )  return( LE );
  121.         if( c == '+' && c2 == '+' )  return( PP );
  122.         if( c == '-' && c2 == '-' )  return( MM );
  123.         if( c == '+' && c2 == '=' )  return( PLE );
  124.         if( c == '-' && c2 == '=' )  return( MIE );
  125.         if( c == '*' && c2 == '=' )  return( MUE );
  126.         if( c == '/' && c2 == '=' )  return( DIE );
  127.         cmd--;
  128.     }
  129.     return( c );
  130. }
  131.  
  132. int yyerror( char *s )
  133. {
  134.     fprintf( stderr,"%s\n",s );
  135.     return( 0 );
  136. }
  137.  
  138. char *getcmd( void )
  139. {
  140.     static char buff[ 128 ];
  141.     char far *ptr,*p = buff;
  142.     int n;
  143.  
  144.     ptr = MK_FP( _psp,0x80 );
  145.     n = *ptr++;
  146.     while( n-- > 0 )  *p++ = *ptr++;
  147.     *p++ = '\n';
  148.     *p = 0;
  149.     return( buff );
  150. }
  151.  
  152. char *int2str( char *str,int num )
  153. {
  154.     if( num < 0 ) {
  155.         *str++ = '-';
  156.         num = -num;
  157.     }
  158.     if( num > 9 )  str = int2str( str,num / 10 );
  159.     *str++ = num % 10 + '0';
  160.     *str   = 0;
  161.     return( str );
  162. }
  163.  
  164. long getval( long ptr )
  165. {
  166.     char *p;
  167.  
  168.     if( isupper( *(char*)ptr ) ) {
  169.         p = envget( (char*)ptr,cenv );
  170.     } else {
  171.         p = envget( (char*)ptr,renv );
  172.     }
  173.     if( p )  return( atoi( p ) );
  174.     return( 0 );
  175. }
  176.  
  177. long putval( long ptr,long val )
  178. {
  179.     char buff[ 10 ];
  180.  
  181.     int2str( buff,val );
  182.     if( isupper( *(char*)ptr ) ) {
  183.         envset( (char*)ptr,buff,cenv );
  184.     } else {
  185.         envset( (char*)ptr,buff,renv );
  186.     }
  187.     return( val );
  188. }
  189.  
  190. void main()
  191. {
  192.     cmd = getcmd();
  193.     renv = pspenv( getrpid() );
  194.     cenv = pspenv( getcpid() );
  195.     yyparse();
  196.     if( ret < 0 || ret > 255 )  ret = 255;
  197.     printf( "%d",ret );
  198.     exit( ret );
  199. }
  200.  
  201.